﻿using System;
using System.Data;
using System.Configuration;
using System.Text;
using System.Security.Cryptography;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.OracleClient;
using bi4homev3.Entidades;

namespace bi4homev3
{

    #region Acceso a Datos

    //Esta clase ya NO ES USADA para operaciones de la aplicacion
    //Solo se deja aqui pues se usa para comprobacion en las pruebas unitarias
    //es decir, se hace la insercion de un local via los DAO usando fabricas abstractas
    //pero para efectos de la prueba unitaria, el metodo de revisar que lo que se creo existe
    //esta en esta clase.

    public class AccesoDatos
    {
        private OracleConnection conexion = new OracleConnection("User Id=aplicacion; Password=123456;");

        private void IniciarConexion() {

            try
            {
                if (conexion.State != ConnectionState.Open)
                    conexion.Open();
            }
            catch (Exception ex)
            {
               
            }
        }

        private void CerrarConexion() {

            try
            {
                if (conexion.State != ConnectionState.Closed)
                    conexion.Close();
            }
            catch (Exception ex)
            {

            }
        
        }

        public int ValidarUsuario(Usuario user) {

            int resultado = 0;
            
            user.Clave = this.cifrado(user.Clave);

            OracleCommand comando = new OracleCommand("APLICACION.VALIDAR_CLAVE_USUARIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("login", OracleType.VarChar, 15));
            comando.Parameters.Add(new OracleParameter("psswd", OracleType.VarChar, 20));
            comando.Parameters["login"].Value = user.Login;
            comando.Parameters["psswd"].Value = user.Clave;
            comando.Parameters.Add(new OracleParameter("checkval", OracleType.Number, 1));
            comando.Parameters["checkval"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["checkval"].Value);
            this.CerrarConexion();
            return resultado;


        }

        public void insertarUsuario (Usuario user)
        {
            OracleCommand comando = new OracleCommand("APLICACION.INSERTAR_USUARIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("login", OracleType.VarChar, 15));
            comando.Parameters.Add(new OracleParameter("psswd", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("apellido", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("correo", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("carga", OracleType.Number, 2));
            comando.Parameters.Add(new OracleParameter("ingreso", OracleType.Float,10 ));
            comando.Parameters["login"].Value = user.Login;
            comando.Parameters["psswd"].Value = cifrado(user.Clave);
            comando.Parameters["nombre"].Value = user.Nombre;
            comando.Parameters["apellido"].Value = user.Apellido;
            comando.Parameters["carga"].Value = user.Carga;
            comando.Parameters["ingreso"].Value = user.Ingreso;
            comando.Parameters["correo"].Value = user.Correo;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public void insertarLocal(Local userLocal)
        {
            OracleCommand comando = new OracleCommand("APLICACION.INSERTARLOCALUSUARIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 30));
            comando.Parameters.Add(new OracleParameter("calle", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("sector", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("referencia", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("fklugar", OracleType.Number, 2));
            comando.Parameters.Add(new OracleParameter("usrname", OracleType.VarChar, 20));
            comando.Parameters["nombre"].Value = userLocal.NombreLocal;
            comando.Parameters["calle"].Value = userLocal.Calle;
            comando.Parameters["sector"].Value = userLocal.Sector;
            comando.Parameters["referencia"].Value = userLocal.Referencia;
            comando.Parameters["fklugar"].Value = userLocal.Lugar;
            comando.Parameters["usrname"].Value = userLocal.Usuario;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public void insertarGastos(Gastos userGasto)
        {
            OracleCommand comando = new OracleCommand("APLICACION.INSERTARSERVICIOUSR", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 30));
            comando.Parameters.Add(new OracleParameter("descripcion", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("usrname", OracleType.VarChar, 20));
            comando.Parameters["nombre"].Value = userGasto.Nombre;
            comando.Parameters["descripcion"].Value = userGasto.Descripcion;
            comando.Parameters["usrname"].Value = userGasto.Usuario;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public void insertarserviciosys(PagoServicio sersys)
        {
            OracleCommand comando = new OracleCommand("APLICACION.INSERTARPAGOSERVICIOSYS", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("cantidad", OracleType.Number, 4));
            comando.Parameters.Add(new OracleParameter("servid", OracleType.Number, 4));
            comando.Parameters.Add(new OracleParameter("factura", OracleType.Number, 20));
            comando.Parameters.Add(new OracleParameter("nombreusr", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("fecha", OracleType.VarChar, 20));
            comando.Parameters["cantidad"].Value = sersys.Monto;
            comando.Parameters["servid"].Value = sersys.Servicio;
            comando.Parameters["factura"].Value = sersys.NumeroFactura;
            comando.Parameters["nombreusr"].Value = sersys.Usuario;
            comando.Parameters["fecha"].Value = sersys.Fecha;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public void insertarserviciousr(PagoServicio sersys)
        {
            OracleCommand comando = new OracleCommand("APLICACION.INSERTARPAGOSERVICIOUSR", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("cantidad", OracleType.Number, 4));
            comando.Parameters.Add(new OracleParameter("servid", OracleType.Number, 4));
            comando.Parameters.Add(new OracleParameter("factura", OracleType.Number, 20));
            comando.Parameters.Add(new OracleParameter("nombreusr", OracleType.VarChar, 20));
            comando.Parameters.Add(new OracleParameter("fecha", OracleType.VarChar, 20));
            comando.Parameters["cantidad"].Value = sersys.Monto;
            comando.Parameters["servid"].Value = sersys.Servicio;
            comando.Parameters["factura"].Value = sersys.NumeroFactura;
            comando.Parameters["nombreusr"].Value = sersys.Usuario;
            comando.Parameters["fecha"].Value = sersys.Fecha;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public string cifrado(string clave)
        {
            Byte[] originalBytes;
            Byte[] encodedBytes;
            MD5 md5;
            string salida;

            //Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password)
            md5 = new MD5CryptoServiceProvider();
            originalBytes = ASCIIEncoding.Default.GetBytes(clave);
            encodedBytes = md5.ComputeHash(originalBytes);

            //Convert encoded bytes back to a 'readable' string
            salida = BitConverter.ToString(encodedBytes);
            return salida; 
        }

        public int existeUsuario (string usrname) 
        {

            int resultado = 0;

            OracleCommand comando = new OracleCommand("APLICACION.EXISTE_USUARIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("usrname", OracleType.VarChar, 15));
            comando.Parameters["usrname"].Value = usrname;
            comando.Parameters.Add(new OracleParameter("existe", OracleType.Number, 1));
            comando.Parameters["existe"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["existe"].Value);
            this.CerrarConexion();
            return resultado;

        }

        public void InsertarMedida (Medida nueva, string usrname)
        {
            OracleCommand comando = new OracleCommand("APLICACION.AGREGARMEDIDA", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 100));
            comando.Parameters.Add(new OracleParameter("descripcion", OracleType.VarChar, 4000));
            comando.Parameters.Add(new OracleParameter("fechaini", OracleType.VarChar, 100));
            comando.Parameters.Add(new OracleParameter("fechafin", OracleType.VarChar, 100));
            comando.Parameters.Add(new OracleParameter("usuario", OracleType.VarChar, 100));
            comando.Parameters["nombre"].Value = nueva.Nombre;
            comando.Parameters["descripcion"].Value = nueva.Descripcion;
            comando.Parameters["fechaini"].Value = nueva.FechaInicio;
            comando.Parameters["fechafin"].Value = nueva.FechaFin;
            comando.Parameters["usuario"].Value = usrname;
            this.IniciarConexion();
            comando.ExecuteScalar();
            this.CerrarConexion();
        }

        public int ValidarExiteLocal(Local locales)
        {

            int resultado = 0;

            OracleCommand comando = new OracleCommand("APLICACION.VERIFICARLOCAL", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 20));
            comando.Parameters["nombre"].Value = locales.NombreLocal;
            comando.Parameters.Add(new OracleParameter("res", OracleType.Number, 1));
            comando.Parameters["res"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["res"].Value);
            this.CerrarConexion();
            return resultado;
        }

        public int ValidarExiteServicio(Gastos gas)
        {

            int resultado = 0;

            OracleCommand comando = new OracleCommand("APLICACION.VERIFICARSERVICIO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("nombre", OracleType.VarChar, 20));
            comando.Parameters["nombre"].Value = gas.Nombre;
            comando.Parameters.Add(new OracleParameter("res", OracleType.Number, 1));
            comando.Parameters["res"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["res"].Value);
            this.CerrarConexion();
            return resultado;
        }

        public int ValidarPago(PagoServicio pago)
        {

            int resultado = 0;

            OracleCommand comando = new OracleCommand("APLICACION.VERIFICARPAGO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("numfactura", OracleType.Number, 20));
            comando.Parameters.Add(new OracleParameter("nombreusr", OracleType.VarChar, 20));
            comando.Parameters["numfactura"].Value = pago.NumeroFactura;
            comando.Parameters["nombreusr"].Value = pago.Usuario;
            comando.Parameters.Add(new OracleParameter("res", OracleType.Number, 1));
            comando.Parameters["res"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["res"].Value);
            this.CerrarConexion();
            return resultado;
        }

        public int ValidarPagoMonto(PagoServicio pago)
        {

            int resultado = 0;

            OracleCommand comando = new OracleCommand("APLICACION.VERIFICARPAGOMONTO", conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.Add(new OracleParameter("numfactura", OracleType.Number, 20));
            comando.Parameters.Add(new OracleParameter("nombreusr", OracleType.VarChar, 20));
            comando.Parameters["numfactura"].Value = pago.NumeroFactura;
            comando.Parameters["nombreusr"].Value = pago.Usuario;
            comando.Parameters.Add(new OracleParameter("res", OracleType.Number, 10));
            comando.Parameters["res"].Direction = ParameterDirection.ReturnValue;
            this.IniciarConexion();
            comando.ExecuteScalar();
            resultado = Convert.ToInt32(comando.Parameters["res"].Value);
            this.CerrarConexion();
            return resultado;
        }
    }
    #endregion
}
